<?php

namespace JsonLowCode\UI;

use JsonLowCode\Schema;
use JsonLowCode\Traits\Props\HasClosable;
use JsonLowCode\Traits\Props\HasDisabled;
use JsonLowCode\Traits\Props\HasFeedback;
use JsonLowCode\Traits\Props\HasLabel;
use JsonLowCode\Traits\Props\HasLabelDetail;
use JsonLowCode\Traits\Props\HasName;
use JsonLowCode\Traits\Props\HasRequireMarkPlacement;
use JsonLowCode\Traits\Props\HasShowFeedback;
use JsonLowCode\Traits\Props\HasShowLabel;
use JsonLowCode\Traits\Props\HasShowRequireMark;
use JsonLowCode\Traits\Props\HasSize;

/**
 * Form 表单组件
 * @method static FormItem make(mixed $children = null) FormItem组件
 */
class FormItem extends Schema
{
    use HasSize, HasLabel, HasLabelDetail, HasShowLabel, HasFeedback;
    use HasShowFeedback, HasShowRequireMark, HasRequireMarkPlacement;

    protected string $componentName = "NFormItem";

    /**
     * @param mixed|null $children
     */
    public function __construct(mixed $children = null)
    {
        parent::__construct();
        $this->componentName($this->componentName);
        $this->children($children);
    }

    /**
     * label
     * @param string|Schema|null $value
     * @return $this
     */
    public function label(string|Schema $value = null): static
    {
        if ($value instanceof Schema){
            return $this->slot("label",$value);
        }else{
            return $this->prop("label",$value);
        }
    }

    /**
     * 表项的反馈信息。不设为 undefined 时，会覆盖规则验证的结果
     * @param string|Schema|null $value
     * @return $this
     */
    public function feedback(string|Schema $value = null): static
    {
        if ($value instanceof Schema){
            return $this->slot("feedback",$value);
        }else{
            return $this->prop("feedback",$value);
        }
    }

    /**
     * 是否只展示首个出错信息
     * @param string|bool $bool
     * @return $this
     */
    public function first(string|bool $bool = true): static
    {
        return $this->prop("first",$bool);
    }

    /**
     * 通常 path 的改变会导致数据来源的变化，所以 naive-ui 会清空验证信息。如果不期望这个行为，可以将其置为 true
     * @param string|bool $bool
     * @return $this
     */
    public function ignorePathChange(string|bool $bool = true): static
    {
        return $this->prop("ignore-path-change",$bool);
    }

    /**
     * 将值收集到外层表单 model 对象的路径
     * @param string $path
     * @return $this
     */
    public function path(string $path): static
    {
        return $this->prop("path",$path);
    }

    /**
     * 验证表项的规则，它会被通过 rule-path 从外层表单获取的规则合并来作为表项的验证规则。推荐还是在外层表单设置所有规则
     * @param string|array $rule
     * @return $this
     */
    public function rule(string|array $rule): static
    {
        return $this->prop("rule",$rule);
    }

    /**
     * 从外层表单的 rules 对象获取规则的路径。如果没有设定，使用表项的 path 代替
     * @param string $rulePath
     * @return $this
     */
    public function rulePath(string $rulePath): static
    {
        return $this->prop("rule-path",$rulePath);
    }

    /**
     * 标签的样式
     * @param string|array $style
     * @return $this
     */
    public function labelStyle(string|array $style): static
    {
        return $this->prop("label-style",$style);
    }

    /**
     * 标签元素的属性
     * @param string|array $props
     * @return $this
     */
    public function labelProps(string|array $props): static
    {
        return $this->prop("label-props",$props);
    }


    /**
     * 表单的验证状态。不设为 undefined时，会覆盖规则验证的结果
     * @param string $status 'error' | 'success' | 'warning'
     * @return $this
     */
    public function validationStatus(string $status = 'error' | 'success' | 'warning'): static
    {
        return $this->prop("validation-status",$status);
    }

}
